package graph;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public abstract class Graph {

	/**
	 * đọc file là ma trận kề
	 * @param path
	 * @return
	 * @throws IOException
	 */
	public int[][] readFile(String path) throws IOException {
		File file = new File(path);
		BufferedReader br = new BufferedReader(new FileReader(file));
		String row = br.readLine();
		int[][] matrix = new int[Integer.parseInt(row)][Integer.parseInt(row)];
		String temp = "";
		int cols = 0;
		int rows = 0;
		while ((temp = br.readLine()) != null) {
			temp.trim();
			String[] arr = temp.split(" ");
			for (String s : arr) {
				matrix[rows][cols++] = Integer.parseInt(s);
			}
			cols = 0;
			rows++;
		}
		br.close();
		return matrix;
	}
	
	/**
	 * in ma trận kề
	 * @param matrix
	 */
	public void printMatrix(int[][] matrix) {
		for (int i = 0; i < matrix.length; i++) {
			for (int j = 0; j < matrix.length; j++) {
				System.out.print(matrix[i][j] + " ");
			}
			System.out.println();
		}
	}
	
	/**
	 * kiểm tra đồ thị có liên thông hay không?
	 * @param matrix
	 * @param node
	 * @return
	 */
	public abstract boolean innerGraph(int[][] matrix, int node);
	
	/**
	 * đếm số thành phần liên thông
	 * @param matrix
	 * @param vertex
	 * @param element
	 * @return
	 */
	public abstract int innerGraphElement(int[][] matrix, int vertex,int element);
	
	
	/**
	 * tính bậc của một đỉnh
	 * @param matrix
	 * @param vertex
	 * @return
	 */
	public abstract int countLevelOfVertex(int[][] matrix, int vertex);
	
	/**
	 * đếm số cạnh của đồ thị
	 * @param matrix
	 * @return
	 */
	public abstract int countEdgeGraph(int[][] matrix);
	
	/**
	 * kiểm tra có đường đi từ đỉnh u đến đỉnh v
	 * @param matrix
	 * @param u
	 * @param v
	 * @return
	 */
	public abstract boolean checkPathBetweenTwoVertex(int[][] matrix, int u, int v);
	
	
	public abstract void printAllPathBetweenTwoVertex(int[][] matrix, int u,int v);
	/**
	 * kiểm tra đồ thị có phải là euler không?
	 * @param matrix
	 * @param node
	 * @return
	 */
	public abstract boolean checkEuler(int[][] matrix,int node);
	
	
	/**
	 * kiểm tra đồ thị có phải là một cây hay không?
	 * @param matrix
	 * @return
	 */
	public abstract boolean checkTree(int[][] matrix);
		
}
